/**
 * License would add here
 */

#ifndef UTILS_JS_SYMBOL_H
#define UTILS_JS_SYMBOL_H

#include <csignal>
#include <cstring>
#include <js_native_api.h>
#include <string>

#include <node_api.h>

#include "js_string.h"
#include "js_value_base.h"
#include "macros.h"

#define IS_SYMBOL(type) VALUE_TYPE_CHECK(IsSymbol(), "symbol", (type))
#define IS_SYMBOL_OR_STRING(type) VALUE_TYPE_CHECK((IsSymbol() || IsString()), "symbol or string", (type))

class JSSymbol : public JSValue {
public:
    JSSymbol(const napi_env env, const char* str)
        : JSValue(env)
    {
        napi_create_symbol(env, JSString(env, str), &value_);
        UpdateType();
    }
    JSSymbol(napi_env env, const char* str, size_t len)
        : JSValue(env)
    {
        napi_create_symbol(env, JSString(env, str, len), &value_);
        UpdateType();
    }
    JSSymbol(const napi_env& env, const std::string& str)
        : JSValue(env)
    {
        napi_create_symbol(env, JSString(env, str), &value_);
        UpdateType();
    }
    JSSymbol(const napi_env& env, const napi_value& value)
        : JSValue(env, value)
    {
        IS_SYMBOL_OR_STRING(type_);
        if (IsString()) {
            napi_create_symbol(env, value, &value_);
        }
    }
    JSSymbol(const JSValue& value)
        : JSValue(value)
    {
        IS_SYMBOL_OR_STRING(type_);
        if (IsString()) {
            napi_create_symbol(env_, value, &value_);
        }
    };

private:
};

#undef IS_SYMBOL
#undef IS_SYMBOL_OR_STRING
#endif /* UTILS_JS_SYMBOL_H */
